package abstract_class;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/22 17:12
 *  抽象类
 *      使用abstract关键字定义抽象方法，且抽象方法所在的类一定是抽象类，抽象方法没有方法体
 *      存在的意义就是强制要求子类覆写某些方法，抽象类任然满足 is a 原则，子类必须满足继承关系才能继承抽象类，且子类只能继承一个抽象类！（单继承局限）
 *          没有方法体的方法一定是抽象方法？？ 错！
 *          还有一类方法没有方法体只有方法声明：native方法 ，本地方法（JVM允许通过特殊方式调用c++的方法，这些方法属于本地方法）
 *
 *          抽象类也是使用abstract关键字声明，可以包含 n 个抽象方法
 *          抽象类无法直接实例话子类，子类继承抽象类必须覆写所有抽象类的抽象方法
 *
 *          抽象类是普通类的超集，普通类有的，抽象类都有，
 *          普通类中的普通方法，构造方法，抽象类都可以存在，也就是抽象类比普通类多一个抽象方法而已
 *      抽象类的使用原则：
 *          1.被abstract定义的类称之为抽象类，抽象类无法直接实例化对象，可以通过向上转型进行实例化
 *          2.抽象类中可以没有 抽象方法，只要一个类中定义了抽象方法，则这个类一定是 抽象类，
 *                                  子类是 普通类，子类继承抽象类，必须覆写所有的抽象方法
 *                                  可以强制子类覆写父类的抽象方法
 *
 *          3.abstract 和 final 、private 不能同时出现
 *              抽象类 abstract 能否和final关键字一起出现 ？
 *                  不可以   被final修饰的方法不能重写，抽象方法子类必须重写
 *                          被final修饰的类不能继承，抽象类必须有子类
 *
 *              抽象方法 abstract能否和private一起出现？ 不可以，私有方法无法覆写，抽象方法必须覆写！矛盾
 *
 *          4.抽象类是普通类的超集，抽象类中任然可以存在普通方法和构造方法，且子类实例化时任然满足继承的原则，
 *          先调用父类的构造方法，在调用子类的构造方法
 *
 *   //快速修成代码：在IDEA中爆红的位置，使用alt+enter
 */
public class Demo {
    public static void main(String[] args) {
        //'Sharp' is abstract; cannot be instantiated 抽象类无法通过new新建对象
//        Sharp sharp = new Sharp() ;
        //但是可以通过向上转型new对象
        Sharp sharp = new Rect();
        sharp.fun();
    }
}
